// 导包
import Vue from 'vue'
import VueRouter from 'vue-router'
// 只要是基于Vue，都需要使用Vue.use，代表Vue中使用路由
Vue.use(VueRouter)

import { getToken } from '@/utils/token'

// 导入页面
/* import Login from '@/views/login/Login'
import Layout from '@/views/layout/Index'
import Welcome from '@/views/layout/welcome/Index'
import Chart from '@/views/layout/chart/Index'
import User from '@/views/layout/user/Index'
import Enterprise from '@/views/layout/enterprise/Index'
import Question from '@/views/layout/question/Index'
import Subject from '@/views/layout/subject/Index'
import NotFound from '@/views/404/NotFound' */

// 动态导入 实现懒加载
const Login = () => import('@/views/login/Login')
const Layout = () => import('@/views/layout/Index')
const Welcome = () => import('@/views/layout/welcome/Index')
const Chart = () => import('@/views/layout/chart/Index')
const User = () => import('@/views/layout/user/Index')
const Enterprise = () => import('@/views/layout/enterprise/Index')
const Question = () => import('@/views/layout/question/Index')
const Subject = () => import('@/views/layout/subject/Index')
const NotFound = () => import('@/views/404/NotFound')

// 创建路由对象
const router = new VueRouter({
  // routes 路由规则配置、这个单词不要写错
  routes: [
    /**
     * meta 可以理解为携带的额外之外，它的值是一个对象，对象里面就可以为所欲为
     * 路由元信息仅仅就是携带点参数，不要把它的功能想得过于强大
     */
    { path: '/login', component: Login, meta: { title: '登录' } },
    { path: '/', redirect: '/login' },
    {
      path: '/layout',
      component: Layout,
      redirect: '/layout/welcome',
      meta: {
        title: '后台管理',
        roles: ['超级管理员', '管理员', '老师', '学生']
      },
      children: [
        // 嵌套路由里面的path，前面不要加/，否则会把layout干掉
        {
          path: 'welcome',
          component: Welcome,
          meta: {
            /**
             * fullPath、icon、title是为了生成左边的每一个菜单项 el-menu-item
             */
            fullPath: '/layout/welcome',
            icon: 'el-icon-s-home',
            title: '首页',
            /**
             * roles是来决定，是否能生成或显示
             */
            roles: ['超级管理员', '管理员', '老师', '学生']
          }
        },
        {
          path: 'chart',
          component: Chart,
          meta: {
            fullPath: '/layout/chart',
            icon: 'el-icon-pie-chart',
            title: '数据预览',
            roles: ['超级管理员', '管理员', '老师']
          }
        },
        {
          path: 'user',
          component: User,
          meta: {
            fullPath: '/layout/user',
            icon: 'el-icon-user',
            title: '用户列表',
            roles: ['超级管理员', '管理员', '老师']
          }
        },
        {
          path: 'enterprise',
          component: Enterprise,
          meta: {
            fullPath: '/layout/enterprise',
            icon: 'el-icon-office-building',
            title: '企业列表',
            roles: ['超级管理员', '管理员', '老师']
          }
        },
        {
          path: 'question',
          component: Question,
          meta: {
            fullPath: '/layout/question',
            icon: 'el-icon-edit-outline',
            title: '题库列表',
            roles: ['超级管理员', '管理员', '老师', '学生']
          }
        },
        {
          path: 'subject',
          component: Subject,
          meta: {
            fullPath: '/layout/subject',
            icon: 'el-icon-notebook-2',
            title: '学科列表',
            roles: ['超级管理员', '管理员', '老师']
          }
        }
        // {
        //   path: '*',
        //   component: NotFound
        // }
      ]
    },
    { path: '*', component: NotFound }
  ]
})

// 导航守卫（前置守卫）
/**
 * 这个回调函数，在每次路由切换之前（无论是声明式导航，还是编程式导航）都会执行这个方法
 *
 * 参数1：to 表示你要去的路径
 * 参数2：from 你上一次的路径
 * 参数3：next 代表放行以及跳转指定的页面
 */
router.beforeEach((to, from, next) => {
  // console.log('to---', to)
  // console.log('from---', from)
  if (to.path === '/login') {
    // 登录页面直接放行
    next()
  } else {
    const token = getToken()
    if (token) {
      // 登录了
      next()
    } else {
      // 没有登录，跳转到登录页面
      next('/login')
    }
  }
})

// 后置守卫，代表已经进入到当前页面了
router.afterEach(to => {
  // callback && callback(参数)
  document.title = to.meta.title || '黑马面面'
})

export default router
